package org.wikinews.base;

import java.util.List;

import javax.persistence.EntityManager;

import org.hibernate.Session;
import org.jboss.seam.annotations.In;

/**
 * Classe base para repositorios de dados.
 * 
 * @author leonardo
 * 
 */
public abstract class BaseRepo<T> {

	@In(value = "entityManager")
	protected EntityManager em;

	public T findById(Class<T> entity, Object id) {
		return em.find(entity, id);
	}

	public void persist(T entity) {
		em.persist(entity);
	}
	
	public void saveOrUpdate(T entity) {
		Session session = (Session) em.getDelegate();
		session.saveOrUpdate(entity);
	}
	
	public void persist(List<T> entityList) {
		for (T entity : entityList) {
			em.persist(entity);	
		}
	}

	/**
	 * Atualiza um objeto que nao esta dentro do contexto. Por exemplo, um
	 * objeto que foi pra tela e depois será atualizado no banco de dados e não 
	 * está dentro de uma conversação. Usar
	 * persist no lugar do merge sempre que possível.
	 * 
	 * @param entity
	 */
	public void merge(T entity) {
		em.merge(entity);
	}

	public void remove(T entity) {
		em.remove(entity);
	}

	public void refresh(T entity) {
		em.refresh(entity);
	}

	public void remove(List<T> entityList) {
		for (T entity : entityList) {
			em.remove(entity);	
		}
	}
}
